/*
 * $Id:
 *
 * Copyright (C) 2011 Refiner Inc.
 * All right reserved
 *
 *============================================================
 * +rVPN Stack : AppIF (Socket Base Interface)
 *============================================================
 * abstract: This module provides controlling socket for API
 * author  : MURATA
 * history :
 *
 */

#ifndef _RSI_APISOCK_H_
#define _RSI_APISOCK_H_

#ifdef NO_THREADS
#define USE_THREAD    0
#else
#define USE_THREAD    1
#endif
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include "rrutil.h"
#include "rvs_msg.h"

#define RSI_RECVBUF_LEN   256
#define RSI_MAX_SOCK      1024
#define RSI_SOCK_WAIT     10
#define RSI_SOCK_WTIME    (10*1000)

typedef struct _rsi_sock {
    struct _rsi_sock* next;
    struct _rsi_sock* prev;
    int sock;
#ifndef NO_THREADS
    void* mutex;
#endif
    rvs_api_msg_t rmsg;
    char recvbuf[RSI_RECVBUF_LEN];
}       rsi_sock_t;

#ifdef __cplusplus
extern "C"{
#endif

/* 初期化 */
void rsi_apisock_init(void);

/* 終了 */
void rsi_apisock_stop(void);

/* 新しいソケットの追加 */
int rsi_apisock_new(int sock, struct sockaddr* addr, socklen_t addrlen);

/* ソケットの解放 */
void rsi_apisock_free(rsi_sock_t* pos);

/* 受信メッセージの取得 */
rvs_api_msg_t* rsi_apisock_rmsg(rsi_sock_t* pos);

/* 受信メッセージの解放 */
void rsi_apisock_release(rsi_sock_t *pos);

/* 最初のエントリの取得 */
rsi_sock_t* rsi_apisock_head(void);

/* 次のエントリ取得 */
rsi_sock_t* rsi_apisock_next(rsi_sock_t* pos);

/* ソケットの取得 */
int rsi_apisock_get(rsi_sock_t*pos);

/* ソケット検索 */
rsi_sock_t* rsi_apisock_search(int sock);

/* 受信イベントの処理 */
int rsi_apisock_recv(rsi_sock_t* pos);

/* 応答の送信 */
int rsi_apisock_send(rsi_sock_t* pos, rvs_api_send_t* smsg);

#ifdef __cplusplus
}
#endif

#endif /* _RSI_APISOCK_H_ */
